package es.uned.etsii.si3.taller.servlets;

import java.sql.SQLException;

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.Preparable;

import es.uned.etsii.si3.taller.Empleado;
import es.uned.etsii.si3.taller.FactoriaFunciones;
import es.uned.etsii.si3.taller.Usuario;
import es.uned.etsii.si3.taller.Empleado.Categoria;
import es.uned.etsii.si3.taller.misc.ProporcionaFuncionalidad;

public class AltaYModificacionEmpleados
	extends ActionSupport
	implements Preparable
{
	private static final long serialVersionUID = 1L;
	
	private Usuario usuario;
	private Empleado empleado;
	private boolean listoParaAceptar = false;
	private boolean esEmpleadoNuevo = true;

	// Getters y setters para los atributos de los formularios
	public Usuario getUsuario() {
		return usuario;
	}
	
	public void setUsuario(Usuario usuarioWeb) {
		usuario = usuarioWeb;
	}
	
	public Empleado getEmpleado() {
		return empleado;
	}
	
	public void setEmpleado(Empleado empleadoWeb) {
		empleado = empleadoWeb;
	}
		
	public Categoria[] getListaCategorias() {
		return Categoria.values();
	}

	
	public boolean getListoParaAceptar() {
		return listoParaAceptar;
	}
	
	public boolean getEsEmpleadoNuevo() {
		return esEmpleadoNuevo;
	}
	
	public void setEsEmpleadoNuevo(boolean nuevo) {
		esEmpleadoNuevo = nuevo;
	}

	@Override
	public void prepare() throws Exception {
		setEsEmpleadoNuevo(empleadoPorUsuario() == null);
	}
	
	Empleado empleadoPorUsuario() throws SQLException {
		if (usuario != null) {
			return Usuario.buscarPorNombreUsuario(usuario.getUsuario()).getEmpleado();
		}

		return null;
	}
	
	public String display() {
		return NONE;
	}
	
	private boolean nuloOVacio(String obj) {
		return (obj == null) || (obj.trim().isEmpty());
	}

	/**
	 * Valida los datos introducidos por el admin para asegurarse de que 
	 * son correctos
	 */
	public void validate() {
		// TODO: Validar los campos para asegurar que no se pasan de tamaño (o pasarlo al formulario)
		if (empleado != null) {
			if ((usuario == null) || nuloOVacio(usuario.getUsuario())) {
				addFieldError("usuario.usuario", "Debe especificar un usuario para el empleado");
			}
			else {
				try {
					Usuario tempUsuario = Usuario.buscarPorNombreUsuario(usuario.getUsuario());
					if (tempUsuario == null) {
						addFieldError("usuario.usuario", "Error: el usuario no existe");
					}
					else {
						if (((tempUsuario.getCliente() == null) && (tempUsuario.getEmpleado() == null)) || (!esEmpleadoNuevo)) {
							setUsuario(tempUsuario);
						}
						else {
							addFieldError("usuario.usuario", "Usuario ilegal: ya está asociado a otro cliente/empleado");
						}
					}
				} catch (SQLException e) {
					addFieldError("usuario.usuario", "Error SQL al intentar comprobar el usuario");
				}
			}

			// TODO: ¿Comprobar que el DNI del empleado es correcto? 
			if (nuloOVacio(empleado.getDni())) {
				empleado.setDni("");
				addFieldError("empleado.dni", "El DNI no puede estar en blanco");
			}

			if (nuloOVacio(empleado.getNombre())) {
				empleado.setNombre("");
				addFieldError("empleado.nombre", "El nombre no puede estar en blanco");
			}
			// TODO: ¿Se fuerzan los apellidos?
			if (nuloOVacio(empleado.getApellidos())) {
				empleado.setApellidos("");
			}			
			if (nuloOVacio(empleado.getTelefono())) {
				empleado.setTelefono("");
			}
			if (nuloOVacio(empleado.getCuentaCorriente())) {
				empleado.setCuentaCorriente("");
			}
			if (empleado.getCategoria() == Categoria.NO_VALIDA) {
				addFieldError("empleado.categoria", "Ha de seleccionarse una categoría");
			}
		}
	}
	
	public String confirmar() {
		addActionMessage("Compruebe los datos una segunda vez antes de confirmar");
		listoParaAceptar = true;
		return NONE;
	}
	
	/**
	 * Crea el empleado
	 * @return actionerror
	 */
	@ProporcionaFuncionalidad(identificador = FactoriaFunciones.ADMIN_NUEVO_EMPLEADO)
	public String crear() {
		try {
			getEmpleado().setUsuario(usuario);
			Empleado.crear(getEmpleado());
			addActionMessage("El empleado " + empleado.toString() + " ha sido creado correctamente");
		} catch (SQLException e) {
			addActionError("Al intentar guardar los datos del empleado: " + e.toString());
			return ERROR;
		}
		
		return SUCCESS;
	}

	/**
	 * Modifica el empleado
	 * @return actionerror
	 */
	@ProporcionaFuncionalidad(identificador = FactoriaFunciones.ADMIN_MODIFICAR_EMPLEADO)
	public String actualizar() {
		try {
			Empleado previo = usuario.getEmpleado();

			if (previo == null) {
				addActionError("No se ha podido recuperar el empleado para el usuario " + usuario.getUsuario());
				return ERROR;
			}
			
			previo.actualizar(empleado);
			addActionMessage("El empleado " + previo.toString() + " ha sido modificado con éxito");
		} catch (SQLException e) {
			addActionError("Al intentar guardar los datos del empleado: " + e.toString());
			return ERROR;
		}
		
		return SUCCESS;
	}
}